package Code_exercise_24.CRM_System;

import java.lang.annotation.ElementType;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

import static Code_exercise_24.CRM_System.DButil.posts;

import Code_exercise_24.CRM_System.PostEntity;

import javax.sound.midi.Soundbank;

public class PostApplication {

    public static void showMenu() {
        System.out.println("--------------------欢迎进入CRM系统--------------------");
        System.out.println("按1.新增一个职位");//ID使用雪花算法获得
        System.out.println("按2.根据ID修改一个职位");
        System.out.println("按3.根据ID删除职位");
        System.out.println("按4.查询所有职位");
        System.out.println("按5.根据ID查询职位");
        System.out.println("按6.根据部门查询职位");
        System.out.println("按7.根据级别查询职位");
        System.out.println("按8.退出系统");
        System.out.println("请输入你的选项：");
    }

    //    1增加职位方法：
    public static void addPost(List<PostEntity> posts, Scanner scanner) {
        System.out.println("请输入需要增加的职位，分别使用英文逗号隔开，格式如下：");
        System.out.println("模板：ID,职位名称,职位编码,部门名称,职位级别,职位状态(0-禁用 1-启用)");
        System.out.println("举例:1, 董事长, CEO, 董事会, 1, 1");
//        把用户输入的字符串存到addPost_input；并且去除整体字符串最前面+最后面的空格
//        scanner.next() 只会读取输入中的下一个单词（即以空格为分隔的字符串），而不会读取整行输入。
//        因此，当你输入 8 , 董事长爸爸 , baba , 爸爸会 , 3 , 0 时，scanner.next() 只会读取到 8，而不会读取完整的输入行，导致 split 方法分割后的数组长度不足。
//          String addPost_input = scanner.next().trim();
        String addPost_input = scanner.nextLine().trim();
//        用户输入的只是一串字符串，需要使用split把它拆分为单独的数据；这里使用“,”将这个字符串拆分为0-5的数组
//        使用正则表达式去除空格，
//        \\s：匹配任何空白字符，包括空格、制表符（\t）、换行符（\n）等。
//          *：表示前面的元素可以出现零次或多次。     ,：匹配逗号字符。
        String[] posts_split = addPost_input.split("\\s*,\\s*");//将字符串按照逗号分割，同时忽略逗号前后的空白字符。
//        将单个的data数组前后去除空格；
//        其中id需要使用Long.parseLong()的原因是因为输入的id是字符串，需要转换为长整型;
//        其中status需要使用integer.parseInt()来转化为整型
//        ***依次增加各个元素，即完成了增加功能***
        Long id_addPost = Long.parseLong(posts_split[0].trim());
        String postName_addPost = posts_split[1].trim();
        String postCode_addPost = posts_split[2].trim();
        String deptName_addPost = posts_split[3].trim();
        String level_addPost = posts_split[4].trim();
        int status_addPost = Integer.parseInt(posts_split[5].trim());
//        把上面处理的数据添加到posts数组
        posts.add(new PostEntity(id_addPost, postName_addPost, postCode_addPost, deptName_addPost, level_addPost, status_addPost));
        System.out.println("成功添加此职位！");
    }


    //    5·根据id查询职位方法：
    public static void findPostByID(List<PostEntity> posts, Scanner scanner) {
        System.out.println("请输入需要查询的ID号，如，1，2，3，4，5等：");
        Long id_findById = scanner.nextLong();
//        设置一个PostEntity实体对象为null，获取它的id，然后在posts集合里循环equals，若相等则将此post赋值给index，
//        否则循环结束后表示没找到，即退出循环，打印未找到。
        PostEntity index = null;
        for (PostEntity post : posts) {
            if (post.getId().equals(id_findById)) {
                index = post;
//                这里加break是因为，id是唯一的字段，找到一个即可退出
                break;
            }
        }
        if (index == null) {
            System.out.println("未找到相关信息");
            return;
        }
        System.out.println("下面是根据ID查询到的职位"+index);
    }


    //    2·根据ID修改职位方法：
    public static void updatePost(List<PostEntity> posts, Scanner scanner) {
        System.out.println("请输入需要查询并且修改的职位ID号，如，1，2，3，4，5等：");
//        输入
        Long input_updateID = Long.parseLong(scanner.next());
        scanner.nextLine();//读取并且丢弃回车符
//        中间变量
        PostEntity post_updatePost = null;
//        循环
        for (PostEntity post : posts) {
//            查询用户输入的完整信息,
            if (post.getId().equals(input_updateID)) {//数据的id来equals用户输入的id
                post_updatePost = post;
                System.out.println("查询到以下信息：" + post_updatePost);
                System.out.println("请完整输入你需要修改的信息，分别使用英文逗号隔开，格式如下：");
                System.out.println("模板：ID,职位名称,职位编码,部门名称,职位级别,职位状态(0-禁用 1-启用)");
                System.out.println("举例:1, 董事长, CEO, 董事会, 1, 1");
//                用户再输入完整的修改信息
                String input_updatePost_add = scanner.nextLine().trim();//输入
                String[] posts_split_update = input_updatePost_add.split("\\s*,\\s*");//切分
//                对数据作去除空格处理
                Long id_trim_update = Long.parseLong(posts_split_update[0].trim());//id是Long型，输入的是字符型，需要进行特殊处理
                String postName_trim_update = posts_split_update[1].trim();
                String postCode_trim_update = posts_split_update[2].trim();
                String deptName_trim_update = posts_split_update[3].trim();
                String level_trim_update = posts_split_update[4].trim();
                int status_trim_update =Integer.parseInt(posts_split_update[5].trim());//status是int型，输入的是字符串型，需要进行特殊处理
//                调用set方法，修改数据
                post.setId(id_trim_update);
                post.setPostName(postName_trim_update);
                post.setPostCode(postCode_trim_update);
                post.setDeptName(deptName_trim_update);
                post.setLevel(level_trim_update);
                post.setStatus(status_trim_update);
//                打印输出
                break;



                //     根据ID删除该职位，然后再根据ID增加职位：posts.remove(post_updatePost);
                //     这种代码在找到匹配的post后，先删除了它，然后又重新添加了一个新的PostEntity对象。
                //     这种操作虽然逻辑上可以实现修改，但会导致集合在遍历时被修改，从而抛出异常。
//                用户再输入完整的修改信息
//                String input_updatePost_add = scanner.next();//输入
//                for (PostEntity post_for : posts) {//循环
//                    if (post_for.getId().equals(input_updateID)) {//比对id是否相同
//                        post_updatePost = post_for;
                //     根据ID删除该职位
//                        posts.remove(post_updatePost);
                //     根据ID增加职位
//                        String[] posts_split = input_updatePost_add.split(",");
//                        Long id_addPost = Long.parseLong(posts_split[0].trim());
//                        String postName_addPost = posts_split[1].trim();
//                        String postCode_addPost = posts_split[2].trim();
//                        String deptName_addPost = posts_split[3].trim();
//                        String level_addPost = posts_split[4].trim();
//                        int status_addPost = Integer.parseInt(posts_split[5].trim());
                //     把上面处理的数据添加到posts数组
//                        posts.add(new PostEntity(id_addPost, postName_addPost, postCode_addPost, deptName_addPost, level_addPost, status_addPost));



            }
        }
        if (post_updatePost == null) {
            System.out.println("未找到相关信息");
        }
        System.out.println("成功更新此职位！");
    }


    //     3·根据id删除职位方法：根据 id 查找并删除对应的 PostEntity 对象
    public static void deletePostByID(List<PostEntity> posts, Scanner scanner) {
        System.out.println("请输入需要查询并且删除的职位ID号，如，1，2，3，4，5等：");
//        获取输入data
        Long input_deletePostByID = Long.parseLong(scanner.next());
        scanner.nextLine();//读取并且丢弃回车符
//        设置一个PostEntity实体对象为null，作用：判断是否找到，相当于中间媒介
        PostEntity post_deletePostByID = null;
//        遍历
        for (PostEntity post : posts) {
            if (post.getId().equals(input_deletePostByID)) {
//                赋值给中间变量post_deletePostByID
                post_deletePostByID = post;
//                ***删除此PostEntity对象，即完成了删除功能***
                posts.remove(post_deletePostByID);
                break;
            }
        }
        if (post_deletePostByID == null) {
            System.out.println("未找到相关信息");
        }
        System.out.println("成功删除此职位！");
    }


    //    4·查询所有职位方法：
    public static void findAllPost(List<PostEntity> posts) {
//        打印出来结果:
//        方法一：一行直接打印出来        System.out.println(posts);
//        方法二：使用循环分行打印
        for (PostEntity post : posts) {
            System.out.println("以下是全部的职位信息："+post);
        }
    }

    //      6·根据部门查询职位方法：
    public static void findPostByDept(List<PostEntity> posts, Scanner scanner) {
        System.out.println("请输入需要查询的部门名称，如董事会，部门：");
//        获取输入data
        String input_findPostByDept = scanner.nextLine();
//        循环获取集合List数据中的部门名称属性，与用户输入的部门名称作equals
        PostEntity post_findPostByDept = null;
        for (PostEntity post : posts) {
            if (post.getDeptName().equals(input_findPostByDept)) {
                post_findPostByDept = post;
                System.out.println(post_findPostByDept);
//                这里不加break是因为：有多个符合要求的字段，需要循环查找；比如“董事会”有多个，循环查找才能打印全部“董事会”
            }
        }
        if (post_findPostByDept == null) {
            System.out.println("未找到相关信息");
        }
    }

    //      7·根据等级level查询职位
    public static void findPostByLevel(List<PostEntity> posts, Scanner scanner) {
        System.out.println("请输入需要查询的等级lever，如1，2，3：");
        String input_findPostByLevel = scanner.nextLine();
        PostEntity post_findPostByLevel = null;
        for (PostEntity post : posts) {
            if (post.getLevel().equals(input_findPostByLevel)) {
                post_findPostByLevel = post;
                System.out.println(post_findPostByLevel);
            }
        }
        if (post_findPostByLevel == null) {
            System.out.println("未找到相关信息");
        }
    }


    //ID Identification 唯一的标识
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        for (; ; ) {
            showMenu();
            int firstInput = scanner.nextInt();
//            scanner.next() 只读取数字，不会读取后面的回车符，导致后续的 scanner.nextLine() 读取到的是一个空行。
//            scanner.nextLine() 会读取到一个空行，而不是用户实际输入的内容。
            scanner.nextLine();//读取并且丢弃回车符

            switch (firstInput) {
                case 1:
                    addPost(posts, scanner);
                    break;
                case 2:
                    updatePost(posts, scanner);
                    break;
                case 3:
                    deletePostByID(posts, scanner);
                    break;
                case 4:
                    findAllPost(posts);
                    break;
                case 5:
                    findPostByID(posts, scanner);
                    break;
                case 6:
                    findPostByDept(posts, scanner);
                    break;
                case 7:
                    findPostByLevel(posts, scanner);
                    break;
                case 8:
                    System.exit(0);
            }
        }
    }
}
